/*
 * @FileName: bsp_gpio.c
 * @Author: GreyQiu qiushaogui@aikosolar.com
 * @Date: 2023-07-12 16:05:59
 * @LastEditors: GreyQiu qiushaogui@aikosolar.com
 * @LastEditTime: 2023-09-23 11:31:56
 * @Description: 
 * 
 * Copyright (c) 2023, All Rights Reserved. 
 */

#include "bsp_gpio.h"

/**
 * @description: 单板所有IO口初始化为相应功能
 * @return 无
 */
void bsp_gpio_init(void) {
    GPIO_InitType GPIO_InitStructure;
    /* Assign default value to GPIO_InitStructure structure */
    GPIO_Structure_Initialize(&GPIO_InitStructure);

    // GPIOA和GPIOB时钟
    RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_GPIOA | RCC_AHB_PERIPH_GPIOB);
    // 复用功能时钟
    RCC_APB2_Peripheral_Clock_Enable(RCC_APB2_PERIPH_AFIO);

    // LED驱动引脚
    GPIO_InitStructure.Pin          = PIN_RELAY_L;
    GPIO_InitStructure.GPIO_Mode    = GPIO_MODE_OUT_PP;
    GPIO_InitStructure.GPIO_Current = GPIO_DS_4MA;
    GPIO_Peripheral_Initialize(PORT_RELAY_L, &GPIO_InitStructure);
    bsp_gpio_reset(PORT_RELAY_L, PIN_RELAY_L);

    GPIO_InitStructure.Pin          = PIN_RELAY_N;
    GPIO_Peripheral_Initialize(PORT_RELAY_N, &GPIO_InitStructure);
    bsp_gpio_reset(PORT_RELAY_N, PIN_RELAY_N);

    // 配置DSP串口外设引脚
    GPIO_InitStructure.Pin            = PIN_DSP_TX;
    GPIO_InitStructure.GPIO_Mode      = GPIO_MODE_AF_PP;
    GPIO_InitStructure.GPIO_Alternate = AF_DSP_TX;
    GPIO_InitStructure.GPIO_Current = GPIO_DS_12MA;
    GPIO_Peripheral_Initialize(PORT_DSP, &GPIO_InitStructure);

    GPIO_InitStructure.Pin            = PIN_DSP_RX;
    GPIO_InitStructure.GPIO_Mode      = GPIO_MODE_INPUT;
    GPIO_InitStructure.GPIO_Alternate = AF_DSP_RX;
    GPIO_InitStructure.GPIO_Pull = GPIO_PULL_UP;
    GPIO_InitStructure.GPIO_Current = GPIO_DS_12MA;
    GPIO_Peripheral_Initialize(PORT_DSP, &GPIO_InitStructure);

    // 配置HMI串口外设引脚
    GPIO_InitStructure.Pin            = PIN_HMI_TX;
    GPIO_InitStructure.GPIO_Mode      = GPIO_MODE_AF_PP;
    GPIO_InitStructure.GPIO_Alternate = AF_HMI_TX;
    GPIO_InitStructure.GPIO_Current = GPIO_DS_12MA;
    GPIO_Peripheral_Initialize(PORT_HMI, &GPIO_InitStructure);

    GPIO_InitStructure.Pin            = PIN_HMI_RX;
    GPIO_InitStructure.GPIO_Mode      = GPIO_MODE_INPUT;
    GPIO_InitStructure.GPIO_Alternate = AF_HMI_RX;
    GPIO_InitStructure.GPIO_Pull = GPIO_PULL_UP;
    GPIO_InitStructure.GPIO_Current = GPIO_DS_12MA;
    GPIO_Peripheral_Initialize(PORT_HMI, &GPIO_InitStructure);

    // 配置ADC采样通道引脚为模拟输入模式
    GPIO_InitStructure.Pin          = PIN_ADC_VAC;
    GPIO_InitStructure.GPIO_Mode    = GPIO_MODE_ANALOG;
    GPIO_InitStructure.GPIO_Current = GPIO_DS_4MA;
    GPIO_InitStructure.GPIO_Pull    = GPIO_NO_PULL;
    GPIO_Peripheral_Initialize(PORT_ADC_VAC, &GPIO_InitStructure);
}

/**
 * @description: IO口置高
 * @param port
 * @param pin
 * @return 无
 */
void bsp_gpio_set(GPIO_Module* port, uint32_t pin)
{
    port->PBSC = pin;
}

/**
 * @description: IO口置低
 * @param port
 * @param pin
 * @return 无
 */
void bsp_gpio_reset(GPIO_Module* port, uint32_t pin)
{
    port->PBC = pin;
}

/**
 * @description: IO口翻转
 * @param port
 * @param pin
 * @return 无
 */
void bsp_gpio_toggle(GPIO_Module* port, uint32_t pin)
{
    port->POD ^= pin;
}

/**
 * @description: 读取IO口值
 * @param port
 * @param pin
 * @return 无
 */
uint8_t bsp_gpio_read(GPIO_Module* port, uint32_t pin)
{
    return GPIO_Input_Pin_Data_Get(port, pin);
}

